下面介绍一下Scala Play框架中的Action/ Controller 以及 Http routing
Action
Play应用程序收到的大多数请求都是由 Action 处理的。
Action 是一种处理带参请求,并将结果发送到客户端的Java方法。
def echo = Action { request =>
Ok("Got request [" + request + "]")
}
Action 将返回play.api.mvc.Result值,表示要发送给客户端的HTTP响应。 在此示例中,Ok构造了一个200 OK响应,响应内容为纯文本。
通常将请求参数标记为 implicit(隐式)很有用,以便其他需要它的API可以省略传递request参数:
def echo = Action { implicit request =>
//Ok("Got request [" + request + "]")
echoMethod("Got request")
}
def echoMethod(p: String)(implicit request: Request[_]) = {
val hasBody = request.hasBody
Ok(p + " hasBody " + hasBody + " echoMethod() " + request)
}
Controller
控制器 Controller 是 Action 生成器。可以将功能相近的ACTION定义到一个 Controller 中,在 app/controllers 目录下新一个 ApiController.scala 的文件,内容如下:
package controllers
import javax.inject._
import play.api.mvc._
@Singleton
class ApiController @Inject() (cc: ControllerComponents) extends AbstractController(cc) {
def echo = Action { implicit request =>
echoMethod("Got request")
}
def echoMethod(p: String)(implicit request: Request[_]) = {
val hasBody = request.hasBody
Ok(p + " hasBody " + hasBody + " echoMethod() " + request)
}
}
Controller 通过 @Inject 声明为依赖注入。
HTTP routing 路由
conf/routes 是路由器使用的配置文件。 该文件列出了所有路由。 每个路由都包含一个HTTP方法和URI模式,并对应一个 Action。
比如,我们在DEMO中添加一个 echo 方法的路由。
GET / controllers.HomeController.index()
GET /explore controllers.HomeController.explore()
GET /tutorial controllers.HomeController.tutorial()
GET /api/echo controllers.ApiController.echo()
访问 http://localhost:9000/echo 的结果如下
router 地址变量参数
URI模式定义了路由的请求路径。 请求路径的一部分可以是动态的,下面的router定义了 name 和 age 两个参数:
GET /api/user/:name/:age controllers.ApiController.user(name, age:Int)
Action中接收变量:
def user(name: String, age: Int) = Action { implicit request =>
Ok("name:" + name + " age:" + age.toString())
}
地址变量由 "/" 来分隔,如果变量中含有"/"等特殊字符,可使用 "*" 定义:
GET /api/home/*address controllers.ApiController.home(address: String)
router querystring参数
GET /api/userage controllers.ApiController.user(name, age:Int)
通过 querystring 同样可以访问到 user 的 Action 方法
http://localhost:9000/api/userage?name=kris&age=28
router 正则变量
您还可以使用$id
GET /api/view/$id<article[0-9]+> controllers.ApiController.view(id)
匹配结果:
http://localhost:9000/api/view/article103 通过
http://localhost:9000/api/view/article-103 不通过
router 变量默认值
可设置变量默认值:
GET /api/userage controllers.ApiController.user(name ?= "kris", age:Int)